home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / dispio.lbr / DISPIO.AQM / dispio.asm
Assembly Source File  |  1985-07-08  |  12KB  |  274 lines

  1. PAGE 60,132
  2. TITLE DISPIO - SUBROUTINE TO PERFORM DIRECT SCREEN I/O
  3. ;                         Listing 3
  4. ;                  C to Assembly Interface
  5. ;   Computer Language, Vol. 2, No. 2 (February, 1985), pp. 49-59
  6. ;
  7. ;Interfacing C to access architecture dependent capabilities 
  8. ;
  9. ;
  10. ;   change to mono monitor - mono_dsp() ; L.P.
  11. ;   change to 80 column color monitor - c80_disp() ; L.P.
  12. ;   change to 40 column color monitor - c40_disp() ; L.P.
  13. ;   setmode - dispio(set_type) ;  AH = 0, set_type is a video mode in dispio.h
  14. ;   set cursor type - dispio(SET_TYPE,type) ;
  15. ;   set cursor position - dispio(SET_CUR,page,(row<<8)+col)
  16. ;   read cursor position - 
  17. ;      dispio(READ_POSITION,page,&start_line,&end_line,&row,&col)    L.P.
  18. ;      Function returns (row<<8)+col    L.P.
  19. ;   read cursor type - read_typ(page,&start_line,&end_line)  L.P.
  20. ;      Function returns (start_line<<8)+end_line    L.P.
  21. ;   read cursor location - read_loc(page,&row,&col)    L.P.
  22. ;      Function returns (row<<8)+col
  23. ;   read light pen position - 
  24. ;      dispio(READ_LIGHT_PEN_POSITION,&switch,&pixel,&raster,&row,&col)   L.P.
  25. ;      Function returns (row<<8)+col
  26. ;   select active page - dispio(SELECT_PAGE+new_page_value) ;
  27. ;   scroll active page up - dispio(SCROLL_UP+number_of_lines,fill_attr,
  28. ;                                  (lrow<<8)+lcol, (rrow<<8)+rcol) ;
  29. ;   scroll active page down - dispio(SCROLL_DN+number_of_lines,fill_attr,
  30. ;                                    (lrow<<8)+lcol,(rrow<<8)+rcol) ;
  31. ;   get attribute character at current cursor pos - 
  32. ;      dispio(READ_ATTRIBUTE_CHAR,page,&attribute,&character) ; L.P.
  33. ;      Function returns (attribute<<8)+character
  34. ;   write attribute character at current cursor position - 
  35. ;      dispio(WRITE_ATTRIBUTE_CHAR+char,(page<<8)+attribute, repeat count);
  36. ;      write_ac(attribute,character,page,repeat_count) ; L.P.
  37. ;   write character - dispio(WRITE_CHAR+character,page,repeat count) ;
  38. ;      write_ch(character,page,repeat_count); L.P.
  39. ;   set color palette - dispio(SET_PALETTE,(palette<<8)+color_value) ;
  40. ;   write dot - dispio(WRITE_DOT+color,col,row) ;
  41. ;   read dot - dispio(READ_DOT,col,row);
  42. ;              dot read returned as integer function value  L.P.
  43. ;   write teletype - dispio(WRITE_TELETYPE+char,(page<<8)+color) ;
  44. ;      writ_tty(character,color,page);
  45. ;   get state - dispio(GET_STATE,&modes,&cols,&page)    L.P.
  46. ;
  47. ;**************************************************************
  48. ;
  49. ;   Surrounded each INT 10H with a PUSH BP / POP BP pair.  This may not be
  50. ;   necessary in every case, but it is for SCROLL, and it makes the others
  51. ;   safe.
  52. ;
  53. ;   L. Paper
  54. ;   6/17/85
  55. ;
  56. ;   Revise documentation for all returned values.  Changed program for all 
  57. ;   returns.  Removed right shifts for input to BH with BL zero.  Added the
  58. ;   following functions which use separate integer input variables:
  59. ;      read_typ, read_loc, write_ac, write_ch, write_tty
  60. ;   I also added three functions to change the monitor:
  61. ;      mono_dis, c80_disp, c40_disp
  62. ;   Note:  I only added the functions which are not in the Greenleaf 
  63. ;   Functions.  The combination gives both the original register oriented
  64. ;   input, which is useful for repeating parameters, and separate integer
  65. ;   input variables, which requires no external manipulation.
  66. ;   L. Paper
  67. ;   7/8/85
  68. ;
  69.  
  70. mono      equ     00110000b       ;mono equip_flag             ;L.P.
  71. c80       equ     00100000b       ;80 column color equip_flag  ;L.P.
  72. c40       equ     00010000b       ;40 column color equip_flag  ;L.P.
  73.  
  74.           ;; set starting video mode to flag                       ;L.P.
  75.           ;; set mode to mode                                      ;L.P.
  76. switch    MACRO   flag,mode                                        ;L.P.
  77.           pop     si                                               ;L.P.
  78.           push    ds               ;save original data segment     ;L.P.
  79.           mov     ax,40h           ;set DS to ROM BIOS data areas  ;L.P.
  80.           mov     ds,ax            ;                               ;L.P.
  81.           mov     bx,10h           ;offset of equip_flag           ;L.P.
  82.       if flag - mono               ;; color monitor                ;L.P.
  83.           mov     ax,[bx]         ;get old equip_flag              ;L.P.
  84.           and     al,11001111b    ;clear equip_flag                ;L.P.
  85.           or      al,flag          ;set new equip_flag             ;L.P.
  86.           mov     [bx],ax         ;save new equip_flag             ;L.P.
  87.       endif                                                        ;L.P.
  88.       ife flag - mono              ;; mono monitor                 ;L.P.
  89.           mov      ax,flag                                         ;L.P.
  90.           or       [bx],ax        ;set new equip_flag              ;L.P.
  91.       endif                                                        ;L.P.
  92.           pop      ds              ;restore original data segment  ;L.P.
  93.       if mode                                                      ;L.P.
  94.           mov      ax,mode         ;0 ==> ah to set mode           ;L.P.
  95.       endif                                                        ;L.P.
  96.       ife mode                                                     ;L.P.
  97.           xor      ax,ax ;0 ==> ah to set mode, 0 ==> al for 40 col;L.P.
  98.       endif                                                        ;L.P.
  99.           jmp      setmode                                        ;L.P.
  100.           ENDM                                                     ;L.P.
  101.  
  102.  
  103. popshift   macro                    ;; int input variable to bh, bl=0  L.P.
  104.            pop     bx               ;                                  L.P.
  105.            mov     bh,bl            ; effectively shift right 8        L.P.
  106.            xor     bl,bl            ; 0==>bl                           L.P.
  107.            endm
  108.            
  109. rcfstart   macro              ;; READ_CURSOR_POSITION functions start
  110.            POP    SI          ;             L.P.
  111.            MOV    AH,3        ;             L.P.
  112.            XOR    AL,AL       ;0==>AL       L.P.
  113.            rcstart
  114.            endm
  115.            
  116. rcstart    macro              ;; READ_CURSOR_POSITION start
  117.            popshift           ;page          L.P. 
  118.            PUSH   BP          ;              L.P.
  119.            INT    10H
  120.            POP    BP          ;              L.P.
  121.            endm
  122.            
  123. outfirst   macro   source,dest      ;; Return first variable to caller  L.P.
  124.            xor      dest&h,dest&h   ; Zero for integer return   L.P.
  125.            outlater source,dest       ;; L.P.
  126.            endm
  127.         
  128. outlater   macro   source,dest     
  129.            pop     di               ; L.P.
  130.            mov     dest&l,source    ; L.P.
  131.            mov     [di],dest&x      ; L.P.
  132.            endm
  133.  
  134. DGROUP  GROUP  DATA
  135. DATA    SEGMENT WORD PUBLIC 'DATA'
  136.         ASSUME  DS:DGROUP
  137. CASE_TABLE DW SETMODE,CURSTYPE,SETCURS,READCURS,READPEN,SETMODE
  138.            DW SCROLL,SCROLL,READAC,WRITEAC,WRITECH,SETPAL,WRITEDOT
  139.            DW WRITEDOT,SETPAL,STATE
  140.  
  141. MAX_IN     EQU ($ - CASE_TABLE - 2) SHR 1
  142.  
  143. ; case table uses 16 words.  
  144. ;
  145. DATA    ENDS
  146. ;
  147. PGROUP  GROUP  PROG
  148. PROG    SEGMENT  BYTE  PUBLIC 'PROG'
  149.         ASSUME   CS:PGROUP
  150.         PUBLIC   DISPIO, READ_TYP, READ_LOC, WRITE_AC, WRITE_CH, WRIT_TTY
  151.         PUBLIC   MONO_DSP, C80_DISP, C40_DISP
  152. ;
  153. DISPIO  PROC    NEAR
  154.         POP     SI
  155.         POP     AX
  156.         MOV     BL,AH
  157.         XOR     BH,BH
  158.         CMP     BL,MAX_IN         ; INVALID FUNCTION CODE ?
  159.         JA      ERROR
  160.         SHL     BX,1
  161.         JMP     CASE_TABLE[BX]
  162. ;
  163. ERROR:  MOV     AX,-1
  164.         JMP     SI
  165. ;
  166. SETCURS:   popshift           ;page
  167.            POP    DX
  168. SETMODE:   PUSH   BP          ;L.P.
  169.            INT    10H
  170.            POP    BP          ;L.P.
  171.            JMP    SI
  172. ;
  173. READCURS:  rcstart
  174.            outfirst ch,a           ;start_line
  175.            outlater cl,a           ;end_line
  176.            outlater dh,a           ;row
  177.            outlater dl,a           ;col
  178.            MOV    AX,DX            ;FUNCTION VALUE   L.P.
  179.            JMP    SI
  180. ;
  181. SCROLL:    popshift           ;fill_attr
  182. WRITEDOT:  POP    CX
  183.            POP    DX
  184.            PUSH   BP          ;L.P.
  185.            INT    10H
  186.            POP    BP          ;L.P.
  187.            XOR    AH,AH       ;0==>AH FOR READ DOT INTEGER VALUE   L.P.
  188.            JMP    SI
  189. ;
  190. READAC:    popshift           ;page
  191.            PUSH   BP          ;L.P.
  192.            INT    10H
  193.            POP    BP          ;L.P.
  194.            outfirst ah,b      ;attribute
  195.            outlater al,b      ;character
  196.            JMP    SI
  197. ;
  198. WRITECH:   popshift            ; page
  199.            JMP    CURSTYPE     ; L.P.
  200.            
  201. WRITEAC:   POP    BX
  202. CURSTYPE:  POP    CX
  203.            JMP    SETMODE       ; Finish  L.P.
  204. ;
  205. STATE:     PUSH   BP          ;L.P.
  206.            INT    10H
  207.            POP    BP          ;L.P.
  208.            outfirst al,c      ;mode
  209.            outlater ah,c      ;cols
  210.            outlater bh,c      ;page
  211.            JMP    SI
  212. ;
  213. READPEN:   PUSH   BP          ;L.P.
  214.            INT    10H
  215.            POP    BP          ;L.P.
  216.            POP    DI          ; SWITCH    L.P.
  217.            MOV    AL,AH       ;L.P.
  218.            XOR    AH,AH       ;L.P.
  219.            MOV    [DI],AX     ;L.P.
  220.            POP    DI          ;PIXEL  L.P.
  221.            MOV    [DI],BX     ;L.P.
  222.            outlater ch,a,raster
  223.            outlater dh,a,row
  224.            outlater dl,a,col
  225.            JMP    SI
  226. ;
  227. READ_TYP:  rcfstart
  228.            outfirst ch,a           ; start_line
  229.            outlater cl,a           ; end_line
  230.            MOV    AX,CX            ; FUNCTION VALUE    L.P.
  231.            JMP    SI
  232. ;
  233. READ_LOC:  rcfstart
  234.            outfirst dh,a       ; row
  235.            outlater dl,a       ; col
  236.            MOV    AX,DX        ; FUNCTION VALUE    L.P.
  237.            JMP    SI
  238. ;
  239. SETPAL:    POP    BX
  240.            JMP    SETMODE      ; FINISH      L.P.
  241. ;
  242. WRITE_CH:  POP    SI            ;                     L.P.
  243.            XOR    BL,BL         ;0 ==> BL             L.P.
  244.            POP    AX            ;CHARACTER ==> AL     L.P.
  245.            MOV    AH,10         ;                     L.P.
  246.            JMP    WRITE_1       ;CONTINUE             L.P.
  247. ;
  248. WRITE_AC:  POP    SI            ;L.P.
  249.            POP    BX            ;ATTRIBUTE ==> BL     L.P.
  250.            POP    AX            ;CHARACTER ==> AL     L.P.
  251.            MOV    AH,9          ;                     L.P.
  252. WRITE_1:   POP    CX            ;PAGE ==> CL          L.P.
  253.            MOV    BH,CL         ;PAGE ==> BH          L.P.
  254.            POP    CX            ;REPEAT_COUNT ==> CX  L.P.
  255.            JMP    SETMODE       ;FINISH               L.P.
  256. ;
  257. WRIT_TTY:  POP    SI            ;                            L.P.
  258.            POP    AX            ;CHARACTER ==> AL            L.P.
  259.            MOV    AH,0EH        ;                            L.P
  260.            POP    BX            ;FOREGROUND COLOR ==> BL     L.P.
  261.            POP    CX            ;PAGE ==> CX                 L.P.
  262.            MOV    BH,CL         ;PAGE ==> BH                 L.P.
  263.            JMP    SETMODE       ;FINISH
  264. ;
  265. MONO_DSP: switch   mono,7          ; CHANGE TO MONOCHROME DISPLAY
  266. ;
  267. C80_DISP: switch   c80,2           ; CHANGE TO 80 COLUMN COLOR DISPLAY
  268. ;
  269. C40_DISP: switch   c40,0           ; CHANGE TO 40 COLUMN COLOR DISPLAY
  270. ;
  271. DISPIO  ENDP
  272. PROG    ENDS
  273.         END
  274.